using System.Collections;
using System.Collections.Generic;
using System;

// 插件基类
// 用于提供更广泛的扩展性
public class Plugin
{
    public virtual void OnInit() {
    }

    public virtual void OnUpdate(float deltaTime) {
    }

    public virtual void OnDestroy() {
    }
}

// 插件管理器
// 用于管理所有插件
public class PluginManager
{ 
    private Dictionary<Type, Plugin> _plugins = new Dictionary<Type, Plugin>();

    static PluginManager _instance;

    // 单例
    public static PluginManager Instance {
        get {
            if (_instance == null) {
                _instance = new PluginManager();
            }
            return _instance;
        }
    }

    // 获取插件
    public static T GetPlugin<T>() where T : Plugin {
        return Instance.GetPlugin(typeof(T)) as T;
    }

    // 注册插件
    // 只能在启动之前调用.
    public void RegisterPlugin(Plugin plugin) {
        if (_plugins.ContainsKey(plugin.GetType())) {
            throw new Exception($"Plugin {plugin.GetType()} already registered");
        }
        _plugins[plugin.GetType()] = plugin;
    }

    // 获取插件
    public Plugin GetPlugin(Type type) {
        return _plugins[type];
    }

    // 初始化插件
    public void Init() {
        foreach (var plugin in _plugins) {
            plugin.Value.OnInit();
        }
    }

    // 更新插件
    public void Update(float deltaTime) {
        foreach (var plugin in _plugins) {
            plugin.Value.OnUpdate(deltaTime);
        }
    }

    // 销毁插件
    public void Destroy() {
        foreach (var plugin in _plugins) {
            plugin.Value.OnDestroy();
        }
    }
}   
